package com.example.yin.utils;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;

/**
 * 用于文件操作的工具类，主要提供资源文件读取、路径构建和文件创建等功能
 * 强制通过TestFileUtil.pathBuild()创建实例TestPathBuild
 * 资源加载方式：使用ClassLoader而非File直接读取  需要调用file.createNewFile()才能真正创建
 */
public class TestFileUtil {

    // 资源文件输入流获取 读取打包在JAR中的
    // 资源文件获取的InputStream需要手动关闭 建议使用try-with-resources
    public static InputStream getResourcesFileInputStream(String fileName) {
        return Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
    }

    // 获取classpath根目录的绝对路径：路径以/结尾，包含URL编码（如空格会变成%20）
    public static String getPath() {
        return TestFileUtil.class.getResource("/").getPath();
    }

    //文件创建与删除 文件存在则删除 返回File对象（文件尚未实际创建）
    public static File createNewFile(String pathName) {
        File file = new File(getPath() + pathName);
        if (file.exists()) {
            file.delete();
        } else {
            //确保父目录存在（自动创建）
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
        }
        return file;
    }

    //文件读取   基于classpath相对路径
    public static File readFile(String pathName) {
        return new File(getPath() + pathName);
    }

    //文件读取  基于用户主目录
    public static File readUserHomeFile(String pathName) {
        return new File(System.getProperty("user.home") + File.separator + pathName);
    }

    /**
     * build to test file path 路径构建
     * 这是一个采用建造者模式设计的路径构建内部工具类，
     * 用于优雅地构建复杂的文件系统路径。
     **/
    //建造者模式 提供链式API构建复杂路径 多级子路径拼接 路径构建
    public static TestPathBuild pathBuild() {
        return new TestPathBuild();
    }
    public static class TestPathBuild {
        //构造方法私有化 ：强制通过TestFileUtil.pathBuild()创建实例
        private TestPathBuild() {
            subPath = new ArrayList<>();
        }

        //路径收集：使用List按顺序保存路径组件
        private final List<String> subPath; //多态

        //链式调用：sub()方法返回自身，支持连续调用 将一个个组件添加到List中
        public TestPathBuild sub(String dirOrFile) {
            subPath.add(dirOrFile);
            return this;
        }

        /**该方法从sub构建的List中获得每个组件并拼接成路径字符串。
        路径构建规则：
        空路径：返回classpath根目录
        单组件路径：直接拼接（避免多余分隔符）
        多组件路径：第一个组件直接追加 后续组件添加系统分隔符后追加
        示例：String path = TestFileUtil.pathBuild()
                        .sub("config")
                        .sub("app")
                        .sub("settings.properties")
                        .getPath();
// 输出示例（Windows）: C:\project\target\classes\config\app\settings.properties*/
        public String getPath() {
            if (CollectionUtils.isEmpty(subPath)) {
                return TestFileUtil.class.getResource("/").getPath();
            }
            if (subPath.size() == 1) {
                return TestFileUtil.class.getResource("/").getPath() + subPath.get(0);
            }
            StringBuilder path = new StringBuilder(TestFileUtil.class.getResource("/").getPath());
            path.append(subPath.get(0));
            for (int i = 1; i < subPath.size(); i++) {
                path.append(File.separator).append(subPath.get(i));
            }
            return path.toString();
        }
    }
}
